package tp.pr5.mv.instructions.stack;

import tp.pr5.mv.Instruction;
import tp.pr5.mv.Memory;
import tp.pr5.mv.Opcode;
import tp.pr5.mv.OperandStack;
import tp.pr5.mv.ProgramCounter;
import tp.pr5.mv.inout.InMethod;
import tp.pr5.mv.inout.OutMethod;
import tp.pr5.mv.instructions.OneParamInstructions;
import tp.pr5.mv.traps.MVTrap;


public class PUSH extends OneParamInstructions { // Esta clase hereda de OneParamInstructions porque posee un parámetro (valor a apilar)
 
	
	public PUSH () { // Constructor por defecto de push
		this.n = 0;
		op = Opcode.PUSH;
	}
	public PUSH (int par) { // Constructor con un parámetro de push
		this.n = par;
		op = Opcode.PUSH;
	}
	
	public void execute ( OperandStack stack, Memory mem, ProgramCounter pc, InMethod inMethod, OutMethod outMethod) throws MVTrap {	
		
		stack.push(n); // Hacemos push con el valor n (Atributo de la clase padre)	

	}
	
	public Instruction create(int par) { // Devolvemos la instrucción push con un parámetro
		
		return new PUSH(par);
		
	}
	
}
